const fs = require("fs");
const path = require("path");
const config = require("./configs.js");
const { generateHeaderFile } = require("./public/useHeaderConfig.js");
const { generateTableFile } = require("./public/useTableConfig.js");
const { generateApiFile } = require("./public/useApiConfig.js");

// 文件生成器
const spannedFile = async (indexVue) => {
  // 查询条件hook生成
  const useHeaderConfig = generateHeaderFile();
  const useTableConfig = generateTableFile();
  const useApiConfig = generateApiFile();
  // 等待 header 文件处理完成 再获取类型文件生成
  const { generateTypeFile } = require("./public/useTypeConfig.js");
  const useTypeConfig = generateTypeFile();

  // 1. 确定基础路径
  let moduleDir; // 直接使用最终模块目录

  if (config.modulePath) {
    // 处理@别名路径（指向同级src目录）
    if (config.modulePath.startsWith("@/")) {
      // 获取同级src目录路径（nodeConfig的父级下的src）
      const siblingSrcPath = path.join(__dirname, "../src");
      // 构建完整目标路径（包含moduleName）
      moduleDir = path.join(
        siblingSrcPath,
        config.modulePath.slice(2),
        config.moduleName
      );
    } else {
      // 普通路径直接解析（包含moduleName）
      moduleDir = path.join(path.resolve(config.modulePath), config.moduleName);
    }
  } else {
    // 未指定路径时，直接在当前目录（nodeConfig）下创建模块目录
    moduleDir = path.join(__dirname, config.moduleName);
  }

  // 2. 确保模块目录存在
  if (!fs.existsSync(moduleDir)) {
    fs.mkdirSync(moduleDir, { recursive: true });
  }

  // 3. 创建子目录结构（hook/api/types）
  ["hook", "api", "types"].forEach((subDir) => {
    const dirPath = path.join(moduleDir, subDir);
    if (!fs.existsSync(dirPath)) {
      fs.mkdirSync(dirPath);
    }
  });

  // 4. 生成文件
  const files = {
    "index.vue": indexVue,
    "hook/useHeaderConfig.ts": useHeaderConfig,
    "hook/useTableConfig.ts": useTableConfig,
    "api/index.ts": useApiConfig,
    "types/index.ts": useTypeConfig,
  };

  Object.entries(files).forEach(([filePath, content]) => {
    const fullPath = path.join(moduleDir, filePath);
    fs.writeFileSync(fullPath, content);
  });
};

// 文件修改器
const updateMenuFile = () => {
  // menu.ts路径查找逻辑
  const MENU_FILE_PATH = (() => {
    // 优先尝试从项目根目录的src查找
    const rootSrcPath = path.join(
      process.cwd(),
      "src",
      "layout",
      "leftSidebar",
      "menu.ts"
    );
    if (fs.existsSync(rootSrcPath)) {
      return rootSrcPath;
    }

    // 尝试从同级src目录查找
    const siblingSrcPath = path.join(
      __dirname,
      "../src/layout/leftSidebar/menu.ts"
    );
    if (fs.existsSync(siblingSrcPath)) {
      return siblingSrcPath;
    }

    // 如果都找不到，使用项目根目录路径（最后尝试）
    return rootSrcPath;
  })();

  try {
    // 1. 读取文件内容（保留所有原始格式）
    const content = fs.readFileSync(MENU_FILE_PATH, "utf-8");

    // 2. 直接操作源代码字符串（不解析AST）
    const targetLine = `resourceName: '${config.moduleNameValue}'`;
    const targetIndex = content.indexOf(targetLine);

    if (targetIndex === -1) {
      throw new Error(
        `未在menu内匹配到菜单名  ${config.moduleNameValue} ！！，请自行添加`
      );
    }

    // 3. 找到目标对象的作用域范围
    let objectStart = content.lastIndexOf("{", targetIndex);
    let objectEnd = content.indexOf("}", targetIndex) + 1;
    let objectStr = content.slice(objectStart, objectEnd);

    // 4. 检查是否已有 frontUrl
    if (objectStr.includes("frontUrl:")) {
      // 替换现有的 frontUrl
      objectStr = objectStr.replace(
        /frontUrl:\s*['"][^'"]*['"]/,
        `frontUrl: '/${config.moduleName}'`
      );
    } else {
      // 新增 frontUrl
      objectStr = objectStr.replace(
        /{/,
        `{\n    frontUrl: '/${config.moduleName}',`
      );
    }

    // 5. 替换原文件内容（完全保留其他部分）
    const updatedContent =
      content.slice(0, objectStart) + objectStr + content.slice(objectEnd);

    // 6. 写回文件
    fs.writeFileSync(MENU_FILE_PATH, updatedContent, "utf-8");
    console.log("✅ menu.ts updated successfully!");
  } catch (error) {
    console.error("❌ Error:", error.message);
    process.exit(1);
  }
};

module.exports = {
  spannedFile,
  updateMenuFile,
};
